#include<iostream>
using namespace std;
int main(){
	int n,m,o,s,c,max=0;
	cin>>n>>m>>o;
	int a[101][16];
	for(int i=0;i<n;++i){ //第i个小朋友想要的玩具用aij来表示，其中ai0代表一共要了几个。
		cin>>a[i][0];
		for(int j=1;j<=a[i][0];++j){
			cin>>a[i][j];
		}
	} 
	bool b[o+1];//用一个数组来标记哪个玩具被买下来了。 
	for(int i=0;i<(2<<o);++i){//一共o的2次方种可能，买或不买，用的二进制枚举法 
		for(int j=0;j<=o;++j)//初始全都没买，都是false 。 
			b[j]=false;
		s=0;c=0;//s代表满足了几个小朋友的需求，c代表买了几个玩具。 
		for(int j=0;j<n;++j){
			int k;
			for(k=1;k<=a[j][0];++k){//观察此时的i是否能满足第j个小朋友的请求。
				if(i&(1<<a[j][k])){ 
					break;
				}
			}
			if(k==a[j][0]+1){//如果满足了 
				for(k=1;k<=a[j][0];++k){
					if(b[a[j][k]]==false){//如果那个玩具没被买的话，买下来，c++ 
						b[a[j][k]]=true;
						c++;
					}
				}
				if(c<=m){//如果已经买了的玩具数小于m 
					s++;//终于满足了一个小孩的请求，s++ 
				}
			}
		}
		if(s>max){//选出所有方案中满足小孩请求最多的那种 
			max=s;
		}
	}
	cout<<max;
	return 0;
}